package top.kaoshanji.p2ch22a;

import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * 代码清单-p2ch22a-572页c：使用自定义注解用于定制序列化
 * author kaoshanji
 * ^_^
 * create time 2025/3/1 16:50
 */
public class SimpleFormatter {

    // 格式化
    public static String format(Object obj) {
        try {
            // 故事从 Class 对象开始，就可以分析其元素构成
            Class<?> cls = obj.getClass();
            StringBuilder sb = new StringBuilder();
            for (Field field: cls.getDeclaredFields()) {
                if (!field.isAccessible()) {
                    field.setAccessible(true);
                }

                // 获得字段上面的注解，就可以进行自定义逻辑了，故事就是从这里开始

                // 字段上面的注解，以及注解的值
                Label label = field.getAnnotation(Label.class);
                String name = label != null ? label.value() : field.getName();

                // 字段的值
                Object value = field.get(obj);

                // 如果字段的类型是 Date 类型就需要特别关照
                if (value != null && field.getType() == Date.class) {
                    value = forMatDate(field, value);
                }

                sb.append(name + "：" + value + "\n");
            }
            return sb.toString();
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    // 特别处理一下日期字段
    private static Object forMatDate(Field field, Object value) {

        // 获取字段上面的注解
        Format format = field.getAnnotation(Format.class);
        if (null != format) {
            // 获取注解的参数值
            SimpleDateFormat sdf = new SimpleDateFormat(format.pattern());
            sdf.setTimeZone(TimeZone.getTimeZone(format.timezone()));
            return sdf.format(value);
        }

        return value;
    }



}
